package com.haidong;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.haidong.dao.UserDao;
import com.haidong.domain.User;
import com.haidong.domain.UserQuery;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;
import java.util.Map;

/**
 *  该测试类主要测试mybatisPlus的各种查询
 */
@SpringBootTest
class MybatisplusApplicationTest2 {
    @Autowired
    private UserDao userDao;

    @Test
    public void testGetAll() {
        // 写一个查询条件类,不建议这种写法
        QueryWrapper qw = new QueryWrapper();
        qw.lt("age",18); // 设置查找条件,age小于18
        List<User> list = userDao.selectList(qw);
        System.out.println(list);
    }

    @Test
    public void testGetAll2(){
        QueryWrapper<User> qw = new QueryWrapper<>();
        // 使用lambda表达式和类名::方法名不容易写错
        qw.lambda().lt(User::getAge,10); // 添加条件
        List<User> list = userDao.selectList(qw);
        System.out.println(list);
    }

    @Test
    public void testGetAll3(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        // 把lambda集成到类名中
        lqw.lt(User::getAge,10);
        List<User> list = userDao.selectList(lqw);
        System.out.println(list);
    }

    // 多条件SQL语句
    @Test
    void testGetAll4(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
//        lqw.lt(User::getAge,10);
//        lqw.gt(User::getAge,30);
        // 使用链式编程表示age:10<x<30的情况,默认是and链接,可以换用or()
//        lqw.lt(User::getAge,10).or().gt(User::getAge,30);
        lqw.lt(User::getAge,10).gt(User::getAge,30);
        List<User> list = userDao.selectList(lqw);
        System.out.println(list);
    }

    @Test
    void testGetAll5(){
        // 模拟页面传输过来数据
        UserQuery userQuery = new UserQuery();
        userQuery.setAge(10);
        userQuery.setAge2(30);

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        if(userQuery.getAge2() != null){
            lqw.lt(User::getAge,userQuery.getAge2());
        }
        if(userQuery.getAge() != null){
            lqw.gt(User::getAge,userQuery.getAge());
        }
        List<User> list = userDao.selectList(lqw);
        System.out.println(list);
    }

    @Test
    void testGetAll6(){
        // 如果需要添加的条件很多的话,需要写很多null校验,同样集成到方法中了
        // 也就是加条件的方法扩展到3参数,首参数为判别式,满足才插入条件
        UserQuery userQuery = new UserQuery();
        userQuery.setAge(10);
        userQuery.setAge2(30);

        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        lqw.lt(userQuery.getAge2() != null,User::getAge,userQuery.getAge2());
        lqw.gt(userQuery.getAge() != null,User::getAge,userQuery.getAge());
        List<User> list = userDao.selectList(lqw);
        System.out.println(list);
    }

    @Test
    void testGetAll7(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<>();
        // selectList默认查询所有字段,指定某些字段
        lqw.select(User::getId,User::getAge);
        List<User> list = userDao.selectList(lqw);
        System.out.println(list);
    }

    // 聚合查询,为了方便使用,查出来的表都起了别名
    @Test
    void testGetAll8(){
        QueryWrapper<User> lqw = new QueryWrapper<User>();
        // 用mp写select语句,复用性不强,不如直接在dao里面写,但是用来添加聚合函数还是可以的
        lqw.select("count(*) as count,tel");
        // 设置分组查询,查出来的结果封装到map键值对组成的集合里
        lqw.groupBy("tel");
        // selectMaps查询之后会返回成map键值对的集合
        List<Map<String, Object>> userList = userDao.selectMaps(lqw);
        System.out.println(userList);
    }

    // 除了lt小于和gt大于还有很多查询条件
    @Test
    void testGetAll9(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        // eq表示等值验证,可以用selectOne和selectList
        lqw.eq(User::getAge,15);
        User user1 = userDao.selectOne(lqw);
        System.out.println("找年龄15的数据" + user1);

        // * gt():大于(>)
        //* ge():大于等于(>=)
        //* lt():小于(<)
        //* lte():小于等于(<=)
        //* between():between ? and ? sql的between,and是包含等于的
        lqw = new LambdaQueryWrapper<>();
        lqw.between(User::getAge,15,50);
        List<User> user2 = userDao.selectList(lqw);
        System.out.println("找年龄[15,50]的:" + user2);
    }

    // 模糊查询
    @Test
    void testGetAll10(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        // 除了like,还有likeLeft和likeRight,分别是在左边和右边加%,
        // 简单来说就是likeLeft是左边模糊,右边精确匹配
        lqw.likeLeft(User::getName,"J");
        // 模糊查找会查找到多个,要多用selectList
        List<User> user = userDao.selectList(lqw);
        System.out.println("start with J" + user);
    }

    // 排序查询
    @Test
    void testGetAll11(){
        LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>();
        /*
         * condition ：条件，返回boolean，
         当condition为true，进行排序，如果为false，则不排序
         * isAsc:是否为升序，true为升序，false为降序
         * columns：需要操作的列
         */
        lqw.orderBy(true,true,User::getAge);
        List<User> user = userDao.selectList(lqw);
        System.out.println("queue for age" + user);
    }
}
